import javax.xml.bind.annotation.XmlType;
import java.util.Arrays;

public class SeqList {
    //
    private int[] elem;//元素
    private int usedSize;//记录当前顺序表 当中有多个有效元素
    private static final int DEFAULT_CAPYCITY=10;
    public SeqList() {
        this.elem=new int[DEFAULT_CAPYCITY];
    }
    //遍历输出顺序表
    public void display(){
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i]+" ");
        }
        System.out.println();
    }
    //新增元素，默认在数据 最后新增
    public void add(int data){
        //首先要考虑数据满的情况
        if(isFull()){
            resize();//elem变为新的数组，
                         // copyOf将原来的elem和其他要加进来的数据组合成新的数据，长度变长了
        }
        this.elem[usedSize]=data;
        usedSize++;
    }
    public boolean isFull(){
        return usedSize==elem.length;
    }
    //判断是否包含某个元素
    public boolean contains(int toFind){
        for (int i = 0; i < elem.length; i++) {
            if(elem[i]==toFind){  //如果是引用型变量要用equals
                return true;
            }
        }
        return false;
    }
    //查找某个元素对应位置 下标
    public int indexof(int toFind){
        for (int i = 0; i < elem.length; i++) {
            if(elem[i]==toFind){
                return i;
            }
        }
        return -1;
    }
    //获取 pos 位置的元素
    public int get(int pos) {
        if (!checkPos(pos)) {
            throw new PoseOutBoundsException("get 获取数据时，pos位置不合法！");
        }
        return elem[pos];
    }
    //获取顺序表的长度
    public int size(){
        return this.usedSize;
    }
    //给 pos 的位置设为 value  -->  更新的意思
    public void set(int pos,int value){
        if (!checkPos(pos)) {
            throw new PoseOutBoundsException("set 获取数据时，pos 位置不合法！");
        }
        this.elem[pos]=value;
    }
    //可以单独来判断 pos 是否合法
    private boolean checkPos(int pos){
        if (pos < 0 || pos >= usedSize){
            return false;
        }
        return true;
    }
    //在pos位置新增元素
    public void add(int pos,int data){
        //判断 pos 是否合法
        if (pos<0||pos>this.usedSize) {
            throw new PoseOutBoundsException("set 获取数据时，pos 位置不合法！");
        }
        //判断是否满了
        if(isFull()){
            resize(); //满了就扩容
        }
        //挪数据
        for (int i =this.usedSize-1; i >= pos ; i--) {
            this.elem[i+1]=this.elem[i];
        }
        //插入数据
        this.elem[pos]=data;
        //顺序表的长度要加1
        this.usedSize++;
    }
    //可单独对扩容进行封装
    private void resize(){
        elem= Arrays.copyOf(elem,2*elem.length);
    }
    //删除第一次出现的关键字 key
    public void remove(int toRemove){
        //先判断顺序表长度是否为空
        if(Empty()){
            return;
        }
        //找到 关键字 的下标位置
        int index=indexof(toRemove);
        if(index==-1){
            return; //没有找到你要删除的数字
        }
        for (int i=index; i < usedSize-1; i++) {
            this.elem[i]=this.elem[index];
        }
        usedSize--;

    }
    //独立判断 顺序表长度 是否为空
    private boolean Empty() {
        return usedSize==0;
    }
    //清空顺序表
    public void clear(){
       /* for (int i = 0; i < usedSize; i++) {
            this.elem[i]=null;
        }*/
        usedSize=0;
    }
}
